package _Banque;

import java.io.Serializable;
import _Exception.IPException;

/**
 * Un Titulaire est une personne physique
 * qui possede un compte bancaire.
 * 
 * @author E. Korfed & Y.Michel & S.Estevane
 */
public class Titulaire implements Serializable
{
	private static final long serialVersionUID = -3538775585286841309L;
	
	private String m_pNom;
	private String m_pPrenom;
	private String m_pDateNaissance;
	private String m_pAdresse;

	/**
	 * Constructeur par defaut
	 */
    public Titulaire()
    {
    	m_pNom="*";
	    m_pPrenom="*";
	    m_pDateNaissance="0000/00/00";
		m_pAdresse="*";
    }

    /**
     * Constructeur normal
     * @param nom : le nom du titulaire
     * @param prenom : le prenom du titulaire
     * @param date : la date de naissance du titulaire
     * @param adresse : l'adresse du titulaire
     * @throws IPException
     */
    public Titulaire(final String nom, final String prenom, final String date, final String adresse) throws IPException
    {
		if (nom == null || prenom == null || date == null || adresse == null)
			throw new IPException("Une ou plusieurs references sont null");
		if (!nom.matches("[a-zA-Z '-]+"))
			throw new IPException(1, "Le nom ne peut contenir que des caracteres alphabetiques, espace, apostrophe et tiret.");
		if (!prenom.matches("[a-zA-Z '-]+"))
			throw new IPException(2, "Le nom ne peut contenir que des caracteres alphabetiques, espace, apostrophe et tiret.");
    	m_pNom = nom.toUpperCase();
		m_pPrenom = prenom.substring(0,1).toUpperCase() + prenom.substring(1).toLowerCase();
		/// --- APPEL A LA CLASSE _BANQUE
		if (!date.matches("[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]"))
			throw new IPException(3, "Format de date non valide");
		m_pDateNaissance = date;
		m_pAdresse = adresse;
    }

    /**
     * retourne le nom du titulaire
     */
    public String getNom() {

    	return m_pNom;
    }

    /**
     * Retourne le prenom du titulaire
     * @return
     */
    public String getPrenom() {

    	return m_pPrenom;
    }

    /**
     * Retourne la date de naissance du titulaire
     * @return
     */
    public String getDate() {

    	return m_pDateNaissance;
    }

    /**
     * Retourne l'adresse du titulaire
     * @return
     */
    public String getAdresse() {

    	return m_pAdresse;
    }

    /**
     * Defini l'adresse du titulaire
     * @param adresse
     * @throws IPException
     */
    public void setAdresse(final String adresse) throws IPException {

		if (adresse == null)
			throw new IPException("Reference null");
    	m_pAdresse= adresse;
    }

    /**
     * Clone un titulaire
     */
    public Object clone() {

    	Titulaire resultat= null;
    	try {resultat= new Titulaire(m_pNom, m_pPrenom, m_pDateNaissance, m_pAdresse);}
    	catch(IPException e) {}
		return resultat;
	}

    /**
     * toString
     */
    public String toString() {

		if (m_pNom.equals("*"))
			return "---";
    	return m_pNom + " " + m_pPrenom + " (" + m_pDateNaissance + ") - " + m_pAdresse;
    }

	/**
	 * Compare deux titulaires
	 */
	public boolean equals(Object op2) {
		if (op2 == null || !(op2 instanceof Titulaire))
			return false;
		Titulaire t = (Titulaire)op2;
		return (m_pNom.equals(t.m_pNom) &&
				m_pPrenom.equals(t.m_pPrenom) &&
				m_pDateNaissance.equals(t.m_pDateNaissance));
	}
}